Technical Note TN2003
Moving Your Code to Mac OS X

目次

CFM & Mach-O
Mac OS 9 のパッケージと Mac OS X のバンドル
プリエンプションとマルチタスキング
ファイル構成
コードの共有
バックグラウンドオンリーアプリケーション
共有メモリ
プロセス間通信
Aqua ユーザインタフェース
Apple ヘルプ
カスタムコントロール (CDEFs)
カスタムリスト定義 (LDEFs)
カスタムメニュー (MDEFs)
カスタムウインドウ (WDEFs)
ADB のパッチング
コンテキストメニューモジュール
I/O Kit を使用するドライバ
jGNEFilter
トラップのパッチング
アプリケーションのための下位互換コーディング
xDEF のための下位互換コーディング
ダブルバッファ化されたウインドウ
特殊フォルダとファイルアクセス権
Opaque 構造体
コードリソース
QuickDraw グローバル
The Scrap Manager

このテクニカルノートでは、既存のアプリケーションを Mac OS X に移行する方法、および既存のアプリケーションやその他のソフトウェアに含まれる機能に相当する機能を実装できる Mac OS X 内の場所について説明します。

このテクニカルノートには、開発者がソースベースで採用でき、pre-Carbon および Carbon 実行環境の両方に対応したアプリケーションのコンパイルを可能にするさまざまな技法を説明するセクションも含まれています。このセクションは、開発する製品を常に現在のテクノロジに対応させると同時に、レガシー環境を使用する顧客もサポートし続ける必要のある開発者に特に役立つ戦略を提供します。

このテクニカルノートの巻末には、さまざまなテクノロジに関連する情報をすばやく参照するための早見表が用意されています。

このテクニカルノートは、System 7、Mac OS 8、または Mac OS 9 で使用するために設計された既存のソフトウェアを Mac OS X でも動作させる必要のあるアプリケーション開発者向けに書かれています。

更新日: 2000 年 10 月 5 日




概要

このセクションでは、アプリケーションを Mac OS X に移行するときに検討する必要のある、重要で高度な概念の全般的概要を示します。

Carbon

既存のアプリケーションは、Mac OS X の Classic 環境内で実行することができます。しかし、これらのアプリケーションは、Carbon アプリケーションとして再コンパイルしないかぎり、Mac OS X が提供するさまざまな機能を利用することができません。

Carbon は Mac OS X に対応した Apple の新しい API セットで、これまで Mac OS 9 で提供されていた重要な API のサブセットと内容豊かな新しい API のセットをまとめたものです。

Carbon API の詳細については、次の Web サイトで Carbon のオンラインマニュアルを参照してください。
http://developer.apple.com/macosx/carbon/.

ページの先頭に戻る


CFM と Mach-O

Mac OS X では、CFM および Mach-O という 2 つのランタイムモデルがサポートされています。Mac OS 8 および Mac OS 9 では Mach-O ランタイムモデルがサポートされていないため、Mac OS X および Mac OS 8/9 の両方で実行できる単一のバイナリアプリケーションは、CFM アプリケーションとしてコンパイルする必要があります。逆に、mach カーネル、または BSD サービスへの直接的なアクセスを必要とするアプリケーションは、Mach-O バイナリとしてビルドされているか、または CFBundle ストラテジを採用して、基盤となる Mach-O コンパイル済みルーチンを呼び出す必要があります。

Mac OS X ランタイムモデルの詳細については、『Mac OS X System Overview』を参照してください。

ページの先頭に戻る


Mac OS 9 のパッケージと Mac OS X の「バンドル」

Mac OS X では、Mac OS 9 のパッケージ形式と新しい Mac OS X のバンドル形式の両方を使用して、「デスクトップ」アプリケーションに「オブジェクトとしてのフォルダ」ユーザインタフェースを提供します。このパッケージ方法を使用すると、いくつかのファイルシステムオブジェクトを含むフォルダが、「デスクトップ」アプリケーションのウインドウ内であたかも単一のファイルのように動作するようになります。新しい Mac OS X のバンドル形式に関する説明は、『Mac OS X System Overview』の中にまとめられています。この文書は次の Web サイトから入手できます。
http://developer.apple.com/techpubs/macosx/macosx.html

Mac OS 9 のパッケージ形式は、「Technical Note 1188 Packages in Mac OS 9」(http://developer.apple.com/ja/technotes/tn1188.html) で詳細に説明されています。また、Mac OS X のバンドル形式は『Mac OS X System Overview』の中で説明されています。

Mac OS 9 のパッケージモデルと Mac OS X のバンドル形式は両方ともフォルダを使用するため、Mac OS 9 のパッケージであると同時に Mac OS X のバンドルでもあるフォルダを設定することができます。このようなフォルダは、Mac OS X のバンドル仕様に準拠しなければなりませんが、Mac OS 9 ファイルは「:Contents:MacOSClassic:」サブフォルダを含むサブディレクトリ内に格納される必要があります。

ページの先頭に戻る


プリエンプションとマルチタスキング

WaitNextEvent によって課される以前の「イベントのポーリング」モデルは、Mac OS X ではもはや必要ありません。Mac OS X で実行される Carbon および Cocoa アプリケーションは、プロセッサ時間のより効率的な使用を可能にする新しい Carbon イベントモデルを使用することができます。Carbon イベントにより、イベントモデルが変更されました。つまり、応答する必要のある状況の変化を検出するためにアプリケーションがイベントのポーリングを行う代わりに、応答する必要のあるイベントが発生するたびに、アプリケーションが呼び出されるようになります。

同様に、Carbon には、対称的にスケジュールされる独自のプリエンプティブタスクを作成するために使用できるマルチプロセッシング API のスイートも用意されています (このテクニカルノートを執筆している時点で、すべての Carbon API をプリエンプティブタスクから呼び出すことはできませんでした。詳細については、マルチプロセッシング API のマニュアルを参照してください)。

Carbon イベントのマニュアルは Carbon SDK に含まれています。また、Apple のマルチプロセッシング API のマニュアルは Multiprocessing SDK に含まれています。

ページの先頭に戻る


ファイル構成

Mac OS X と Carbon は、タイプとクリエータを含む Mac OS に伝統的な 2 つのフォークから構成されるファイルだけでなく、ファイル拡張子を含む単一フォークから構成されるファイルを対象にも動作するように設計されています。r.

ページの先頭に戻る


コードの共有

Code Fragment Manager は、Mac OS X の Carbon API に完全に実装されています。同様に、Mac OS X は、フレームワーク(Framework)と呼ばれるコードの共有に対応した新しいメソッドを実装しています。フレームワークは、Mac OS X のバンドルとしてパッケージされているライブラリです。フレームワークは本質的に、共有コード内にソフトウェアに関連するヘッダとともにパッケージされた共有ライブラリです。

フレームワークは、『Mac OS X System Overview』の中で説明されています。

ページの先頭に戻る


バックグラウンドオンリーアプリケーション

バックグラウンドオンリーアプリケーションは完全にサポートされています。さらに、多くの場合、システムリソースへのより効率的なアクセスを実現するため、バックグラウンドオンリーアプリケーションを Mach-O 実行可能ファイルとして実装することが可能です (その結果、バックグラウンドオンリーアプリケーションはデーモンプロセスとして機能するようになります)。

ページの先頭に戻る


共有メモリ

Mac OS X 環境で実行されるアプリケーションでは、アプリケーション間の通信に共有メモリ領域を使用することができます。ただし、Mac OS X では、それぞれのアプリケーションに対して保護された個別のメモリパーティションを使用するため、アプリケーション間で共有されるメモリを実装するには追加の作業が必要になります。

注意: Carbon アプリケーションも、アプリケーション間でスモールイベントタイプの通知を送信するために Core Foundation の通知機能にアクセスすることができます。また、Mac OS X Mach-O バイナリとしてコンパイルされた Carbon アプリケーションは、メモリを共有するために BSD API にアクセスできます。

ページの先頭に戻る


プロセス間通信

PPC ToolBox は、Carbon アプリケーションでは使用できません。Carbon では、相当する機能が Apple Event Manager によって用意されています。PPC ToolBox を使用するコードは、Apple Event Manager を使用するように変更してください。

注意: Carbon アプリケーションも、アプリケーション間でスモールイベントタイプの通知を送信するために Core Foundation の通知機能にアクセスすることができます。また、Mac OS X Mach-O バイナリとしてコンパイルされた Carbon アプリケーションは、Mach-O スタイルのメッセージングにアクセスできます。

ページの先頭に戻る




ユーザの操作感

Macintosh はこれまで、操作が容易で、わかりやすく、また操作方法が一貫したコンピュータとして高い評価を得てきました。Mac OS X は、Aqua と呼ばれるより洗練されて拡張されたユーザインタフェースにより、まったく新しいレベルでこのような Macintosh の伝統を継承します。ユーザは、アプリケーションが Aqua ユーザインタフェースを全面的に利用することを期待します。このようなユーザの期待に応える最善の方法の 1 つは、開発者が新しい Aqua ヒューマンインタフェースガイドラインに準拠することです。

Aqua ユーザインタフェース

アプリケーションを Carbon アプリケーションとしてコンパイルし、そのアプリケーションがユーザインタフェースを描画するために標準的なシステムコントロールと Appearance Manager ルーチンを使用している場合、Mac OS X 上で実行するとき、そのアプリケーションは Aqua ユーザインタフェースを表示できるようになります。

既存のアプリケーションを Mac OS X に移行するときは、製品のインタフェースを一新するために時間をかけてください。これを行うことで、製品を競合製品から差別化して卓越したものにする優れたユーザの操作感を提供できるようになります。

アプリケーションに Aqua を採用する方法については、『Adopting Aqua』(http://developer.apple.com/techpubs/macosx/) を参照してください。

ページの先頭に戻る


Apple ヘルプ

一貫した説得力のある方法でユーザにヘルプコンテンツを提供することは、ユーザの操作感を向上させるための主要な構成要素の 1 つとなります。これを実現するための最善の方法は、Mac OS X に対応した HTML ベースのヘルプシステムである Apple ヘルプを使用することです。

AppleGuide とバルーンヘルプはもはやサポートされず、Apple ヘルプが Mac OS X に対応した唯一のヘルプソリューションとなります。Apple ヘルプは HTML 3.2 に基づき、サードパーティ製の一般的な Web オーサリング製品によるコンテンツのオーサリングを可能にします。また、QuickTime、AppleScript、URL Access、Internet Config、VTwin、HTML Rendering Library、Carbon など、Apple の多くのコアテクノロジに基づいて設計されています。

Apple ヘルプの使い方の詳細については、Apple Help SDK (http://developer.apple.com/sdk/index.html) を参照してください。

ページの先頭に戻る




カスタムコードリソース

カスタムコードリソースは、Carbon アプリケーションではもはや使用されません。その代わりに、アプリケーションは新しい API を使用して、カスタムコントロール、カスタムウインドウ、カスタムメニュー、およびカスタムリストを作成する必要があります。ここでは、これらの新しい API について説明します。

カスタムコントロール (CDEF)

カスタムコントロール定義プロシージャは今後、個別のスタンドアロンコードリソースとしてコンパイルされません。Carbon では、カスタム定義プロシージャをアプリケーションとしてコンパイルし、CreateCustomControl ルーチンを使って、カスタム定義プロシージャを使用するコントロールを作成しなければなりません。

通常、CreateCustomControl に渡すコントロール定義ルーチンは CDEF ルーチンと同様に古い呼び出し規約を使用するため、コードを Carbon に移行するには、コードリソースをアプリケーションとして再コンパイルし、カスタム描画メソッドを使用するコントロールを作成するときに CreateCustomControl を使用するように切り替えるだけです。

クロスコンパイル可能な Carbon/pre-Carbon ソースベースの維持に関心のある開発者は、「xDEF のための下位互換コーディング」のセクションで概説されている方法を使用することができます。

ページの先頭に戻る


カスタムリスト定義 (LDEF)

カスタムリスト定義は CreateCustomList API を使用するようになりました。ただし、多くの場合は、これまで List Manager が使用されていた場所で、新しいデータブラウザコントロールを使用することをお勧めします。データブラウザコントロールは、Mac OS 9 と Mac OS X の両方で実行する Carbon アプリケーションで使用できます。

ページの先頭に戻る


カスタムメニュー (MDEF)

カスタムメニューは CreateCustomMenu API を使用するようになりました。

ページの先頭に戻る


カスタムウインドウ (WDEF)

カスタムウインドウは CreateCustomWindow API を使用するようになりました。ウインドウ定義プロシージャを個別のコードリソースに格納することはもはや必要ありません。リスト 1 と 2 は、ウインドウ定義ルーチンを実装する方法と、それを使用するウインドウを作成する方法を具体的に示しています。

 

                           
    static pascal long SimpleFrameDef(short varCode, WindowRef window,
                                      short message, long param)
    {
    #pragma unused( varCode )
                           
        switch ( message )
        {
            case kWindowMsgGetFeatures:
                *(OptionBits*) param = kWindowCanGetWindowRegion
                                       | kWindowDefSupportsColorGrafPort;
                return 1;
                
            case kWindowMsgGetRegion:
            {
                GetWindowRegionRec* rgnRec  = (GetWindowRegionRec*) param;
                
                if ( rgnRec->regionCode == kWindowContentRgn
                     || rgnRec->regionCode == kWindowStructureRgn )
                {
                    Rect portBounds;
                    GetWindowBounds( window, kWindowGlobalPortRgn,
                                     &portBounds );
                    RectRgn( rgnRec->winRgn, &portBounds );
                    
                    if ( rgnRec->regionCode == kWindowStructureRgn )
                        InsetRgn( rgnRec->winRgn, -1, -1 );
                }
                return noErr;
            }
                
            case kWindowMsgDraw:
            {
                Rect portBounds;
                GetWindowBounds( window, kWindowGlobalPortRgn, &portBounds );
                InsetRect( &portBounds, -1, -1 );
                FrameRect( &portBounds );
                break;
            }
            
            case kWindowMsgHitTest:
                return wInContent;
            
            default:
                break;
        }
        
        return 0;
    }
                           

リスト 1 ウインドウ定義ルーチン実装するコード

リスト 1 に示したウインドウ定義ルーチンを使用すると、CreateCustomWindow ルーチンを呼び出すことで、この定義を使用する新しいウインドウを作成することができます。リスト 2 には、この方法を具体的に説明するサンプルを示します

                           
    WindowDefSpec   defSpec;
    WindowRef       floater;
    
    defSpec.defType = kWindowDefProcPtr;
    defSpec.u.defProc = NewWindowDefUPP( SimpleFrameDef );
    
    SetRect( &bounds, 10, 60, 200, 200 );
    CreateCustomWindow( &defSpec, kFloatingWindowClass,
                        kWindowStandardFloatingAttributes,
                        &bounds, &floater );
    ShowWindow( floater );
                           

リスト 2 リスト 1 で定義したウインドウ定義プロシージャを使用するウインドウを作成する方法を具体的に説明するコード

ページの先頭に戻る




システム機能拡張とコントロールパネル

システム機能拡張とコントロールパネルは、Mac OS X ではアプリケーションとして実装しなければなりません。一方、Mac OS 9 の場合、これらは APPE および APPC タイプのアプリケーションとして実装する必要があります。次に、システム機能拡張とコントロールパネルによって一般的に使用されるいくつかの機能の概要と、Mac OS X でのそれらのステータスを示します。

ADB のパッチング

ADB Manager は Mac OS X ではサポートされません。

ページの先頭に戻る


コンテキストメニューモジュール

コンテキストメニューモジュール (CMM) は Mac OS X でもサポートされます。ただし、以前の SOM オブジェクト形式は使用されません。CMM をロードするシステムは、コンテキストメニュー項目サブフォルダ (このフォルダの厳密な位置は、kContextualMenuItemsFolderType セレクタを使って FindFolder を呼び出すことによって決定できます) 内の CFM プラグインとして保存する必要があります。

ページの先頭に戻る


I/O Kit を使用するドライバ

『Inside Macintosh: Devices and Drivers』でマニュアル化されているこれまでの Mac OS デバイスドライバ API はもはやサポートされません。Mac OS X で使用するドライバの作成に関心のある開発者は、新しいデバイスドライバ API を使用する必要があります。現在、これらの API は、Mac OS X Developer Tools の一部です。(関連するヘッダーファイルは IOKit.framework および Kernel.framework に含まれています。)

Mac OS X に対応したドライバ開発の詳細については、Mac OS X のインストールディスク (/Developer/Documentation/Kernel) または Mac OS X Developer Documentation Web サイト (http://developer.apple.com/techpubs/macosx/) にある I/O Kit のマニュアルを参照してください。

また、I/O Kit のソースコードは、Apple の Darwin Public Source Web サイト (http://www.publicsource.apple.com) からもダウンロードできます。I/O Kit を含むプロジェクトは、xnu (カーネルを含む) および IOKitUser (IOKitLib を含む) です。

ページの先頭に戻る


jGNEFilter

jGNEFilter は Mac OS X ではサポートされません。

ページの先頭に戻る


トラップのパッチング

Mac OS X にはトラップテーブルは含まれていません。

ページの先頭に戻る




特殊な問題

このセクションでは、製品を Mac OS X に移行するときに検討する必要のあるその他の特殊な問題について説明します。

アプリケーションのための下位互換コーディング

Carbon または pre-Carbon 環境に対応してコンパイルできる下位互換性のあるコードベースを維持することができます。このセクションは、pre-Carbon システムを使用する顧客をサポートすると同時に、最新の Carbon ヘッダを使用してソースベースを常に最新の状態に保持しようとしている開発者向けに書かれています。

pre-Carbon 実行に対応したコンパイルを行うには、次のステップを使用します

  • Universal Interfaces 3.3.2 以降を使用していることを確認します。Universal Interfaces の最新バージョンは、http://developer.apple.com/sdk/index.html から入手できます。
  • コンパイル時間シンボルの OPAQUE_TOOLBOX_STRUCTS と ACCESSOR_CALLS_ARE_FUNCTIONS を 1 に設定します。
  • CarbonAccessors.o およびその他必要なライブラリをすべてリンクします。
  • コンパイル時間変数 TARGET_API_MAC_CARBON を使って、プログラムの Carbon 固有部分のコンパイルを制御します。

重要

CarbonAccessors.o は、CarbonLib アプリケーションまたは InterfaceLib アプリケーションのいずれかとしてコンパイルできる製品のソースベースを維持することを可能にしますが、InterfaceLib アプリケーションが CarbonLib でのみ使用可能なルーチンを使用することを許可しません。CarbonAccessors.o を使用するときに何らかの問題が発生した場合は、Apple の Bug Reporting Web ページ (http://developer.apple.com/bugreporter/index.html) を使用して、問題を Apple にレポートしてください。


さらに、アプリケーションを Carbon アプリケーションとしてコンパイルするには、次のステップを使用します。

  • Universal Interfaces 3.3.2 以降を使用していることを確認します。
  • コンパイル時間シンボル TARGET_API_MAC_CARBON を 1 に設定します。
  • CarbonLib およびその他必要なライブラリをすべてリンクします。
  • コンパイル時間変数 TARGET_API_MAC_CARBON を使って、プログラムの Carbon 固有部分のコンパイルを制御します。
  • 'carb' ID=0 リソースをアプリケーションのリソースフォークにインクルードします。

多くの場合、アプリケーションの Carbon および pre-Carbon 互換ソースベースを作成するための最小要件は、リスト 3 に示す条件ステートメントをプログラムのメインルーチンに追加することです。

                           
#if ! TARGET_API_MAC_CARBON
#ifndef __MWERKS__
QDGlobals qd; /* QuickDraw globals */
#endif
#endif
                           
                           
int main(void) {
                           
#if ! TARGET_API_MAC_CARBON
    SetApplLimit(GetApplLimit());
    MaxApplZone();
    InitGraf(&qd.thePort);
    InitFonts();
    InitWindows();
    TEInit();
    InitMenus();
    InitDialogs(0);
#endif
    InitCursor();
    . . .
                           

リスト 3 Carbon/pre-Carbon クロス互換アプリケーションの作成に必要ないくつかのプリプロセッサ時間を具体的に説明するコード



大多数のケースでは、アプリケーションを Carbon 化して、上述のコンパイル時間構造体をアプリケーションにインクルードすると、アプリケーションを System 7 から System 8 に対応した pre-Carbon アプリケーション、System 8.1、Mac OS 9.x、および Mac OS X に対応した CFM Carbon アプリケーション、および Mac OS X に対応した Mach-O Carbon アプリケーションとしてコンパイルすることが可能になります。ただし、Carbon インタフェースで提供される API は、それらがアプリケーションを実行する環境内に実装されている場合のみ使用可能である点に注意してください。

リスト 3 のコードは、クロス互換 Carbon/pre-Carbon コードに最小限必要なコンパイラ除外要件を示しています。アプリケーションが使用するオペレーティングシステムの部分によっては、ソースファイル内のさらに別の場所に、追加のコンパイル除外要件を配置しなければならない場合もあります。最も明らかな場所は次のとおりです。

  • リスト 3 に示すような初期化ステートメント。
  • SystemClick の呼び出し。
  • OpenDeskAcc や AddResMenu などの、アップルメニューの管理に関連する API の呼び出し (Carbon アプリケーションでは、アップルメニューは自動的に管理されます)。
  • CDEF、LDEF、WDEF などのカスタムコードリソースを使用する場所。クロス Carbon 互換コードを維持する技法については、次の「xDEF のための下位互換コーディング」のセクションと「カスタムコードリソース」のセクションを参照してください。

ページの先頭に戻る


xDEF のための下位互換コーディング

カスタム定義プロシージャを作成して使用する下位互換コードベースを維持することができます。このセクションでは、その具体的な方法を説明する LDEF のサンプルを示します。

Carbon アプリケーションの場合、定義ルーチンはアプリケーションの実行可能ファイル内に格納されます。これらのルーチンは、以前のシステムバージョンのように個別のコードリソースとしては格納されません。このサンプルの定義ルーチンは、pre-Carbon ビルドと Carbon ビルドの両方でアプリケーションのコード内に格納されます。pre-Carbon ビルドの場合、定義ルーチンのコードをコードリソースに格納する代わりに、コードリソースには、アプリケーションに格納されているルーチンにジャンプする単一のジャンプ命令が含まれます。リスト 4 は、コードリソースに保存されるジャンプ命令の形式を具体的に説明する C の宣言を示します。また、図 1 は、ResEdit ウインドウに表示したこのリソースの具体例を示しています。


                           
#if ! TARGET_API_MAC_CARBON
                           
#define kPatchResID 128
#define kPatchResTYPE 'LDEF'
                           
#pragma options align=mac68k
typedef struct {
    short jmpabs;       /* 4EF9 */
    ListDefUPP theUPP;  /* 00000000 */
} **PatchResource;
#pragma options align=reset
                           
#endif
                           

リスト 4 LDEF リソースへのアクセスに使用される型定義


アプリケーションを Carbon アプリケーションとしてコンパイルするとき、このリソースは無視されます。また、このリソースが占有するスペースは取るに足らないものであるため、このリソースをリソースフォーク内に放置しても特に障害が発生することはありません。


RsrcLDEF
図 1 ResEdit ウインドウに表示された LDEF リソースの内容


アプリケーションの内部に、定義ルーチンそのもののコードを書き込みます。多くの場合、これらのルーチンのプロトタイプは Carbon で変更されていないため、定義プロシージャそのものの中に特殊なコンパイル時間スイッチは必要ありません。

リスト 5 は、この方法を使ってコンパイルされたカスタムリスト定義を使用する方法を具体的に示しています。Mac OS 9 の場合、コードリソースはアプリケーション内で定義されている定義プロシージャをポイントするようにセットアップされ、リストは以前の LNew ルーチンを使って作成されます。一方、アプリケーションが Carbon アプリケーションとしてコンパイルされているとき、LDEF リソースは使用されません。その代わりに、Carbon アプリケーションは CreateCustomList 呼び出しの中にリスト定義プロシージャへの参照を提供します。


                           
    /* the list definition procedure */
    
static pascal void HListDataLDEF(short lMessage,
    Boolean lSelect, Rect* lRect, Cell lCell, short lDataOffset,
    short lDataLen, ListHandle lHandle) {
    
    . . .
    
}
    
    . . .
                           
                           
    ListHandle theList; /* リストに使用するストレージ */
    
    . . .
                           
#if TARGET_API_MAC_CARBON
                           
        /* Carbon アプリケーションは CreateCustomList API を使用する */ 
    ListDefSpec theSpec;
    theSpec.defType = kListDefUserProcType;
    theSpec.u.userProc = NewListDefProc(HListDataLDEF);
    CreateCustomList(bounds, &dataBounds, cSize, &theSpec,
        theWindow, true, hasGrow, false, true, &theList);
                           
#else
                           
        /* pre-Carbon アプリケーションは、LDEF 内のアドレスを
        リスト定義ルーチンを参照するルーチンディスクリプタに
        設定する */ 
    PatchResource gLDEFrsrc;
    gLDEFrsrc = (PatchResource) GetResource(kPatchResTYPE, kPatchResID);
    (**gLDEFrsrc).theUPP = NewListDefProc(HListDataLDEF);
    theList = LNew(bounds, &dataBounds, cSize, kPatchResID,
        theWindow, true, hasGrow, false, true);
                           
#endif
                           
                           

リスト 5 カスタムリスト定義ルーチンを使用するリストの作成


ページの先頭に戻る


ダブルバッファ化されたウインドウ

Mac OS X のスクリーンは自動的にダブルバッファ化されます。通常の描画と更新イベントへの応答の場合、何からの特殊な描画を行う必要はありません。ただし、一部の環境では、システムが表示するウインドウの内容を明示的に描画することを要求しなければならないこともあります。リスト 6 は、この方法を具体的に示しています。

                           
    CGrafPtr thePort;
    WindowPtr theWindow;
    
    thePort = GetWindowPort(theWindow);
    
        /* ポート全体をフラッシュする */
    if (QDIsPortBuffered(thePort))
        QDFlushPortBuffer(thePort, NULL);
  
        /* ポートの一部をフラッシュする */
    if (QDIsPortBuffered(thePort)) {
        RgnHandle theRgn;
        theRgn = NewRgn();
            /* ローカルポート座標 */
        SetRectRgn(theRgn, 10, 10, 100, 30); 
        QDFlushPortBuffer(thePort, theRgn);
        DisposeRgn(theRgn);
    }
                           

リスト 6 あるウインドウの Grafport の内容のスクリーンへのフラッシュ


重要

Carbon ウインドウ内に描画される項目は、アプリケーションが直接的または間接的にイベントループ (RunApplicationEventLoop、WaitNextEvent、GetNextEvent、TrackMouseLocation など) を呼び出す場合にのみ、自動的にスクリーンにフラッシュされます。

アプリケーションがイベントループを呼び出すことなしにウインドウを更新しようとする場合 (たとえば、プログラムの起動時にスプラッシュウインドウ内に項目を描画する場合など)、ウインドウ内に描画された項目がスクリーンにフラッシュされる (QDFlushPortBuffer を呼び出すことで) のを確認することはアプリケーションの責任です。



デフォルトの設定で、すべてのウインドウはダブルバッファ化されます。この動作が望ましくない場合は、kWindowNoBufferingAttribute 属性を指定して CreateNewWindow を呼び出すことで (リスト 7 を参照)、明示的に無効にすることができます。

                           
    CreateNewWindow(kDocumentWindowClass, kWindowNoBufferingAttribute,
                &bounds, &theWindow);
                           

リスト 7 バッファリングをオフにしたウインドウの作成


ページの先頭に戻る


特殊フォルダとファイルアクセス権

FindFolder ルーチンは Mac OS X でも完全にサポートされており、システムによって指定される特殊フォルダを検出するために使用できます。Mac OS X でのこれらのフォルダの位置と以前のシステムリリースでの位置とは劇的に異なる可能性があるため、FindFolder によって返されるボリュームおよびディレクトリ情報は、特殊フォルダの位置を検出するために唯一サポートされる方法になりました。

なお、ユーザごとに、これらの特殊ディレクトリに保存されているファイルに対するファイルアクセス権が異なる可能性のあることに注意してください。アプリケーションがこうした条件下で動作できることを確認する方法については、次のアドレスにある Multiple Users Info Kit を参照してください。
ftp://ftp.apple.com/developer/Technical_Documentation/MultipleUsers_Info_Kit_R3/.

ページの先頭に戻る




一般的なコーディングの変更

このセクションでは、Carbon への移行時にアプリケーションに加える必要のある一般的な変更について説明します。

Opaque(不可視) 構造体

大部分の Toolbox 構造体は opaque になりました。これは、大部分の Toolbox 構造体への直接的なアクセスがもはや不可能であり、アクセッサルーチンによってのみアクセスできるということを意味します。

ページの先頭に戻る


コードリソース

CDEF、WDEF、LDEF などのカスタムコードリソースはもはや使用されません。その代わりに、これらの機能の実装を可能にする新しいメカニズムが存在します。これらのメカニズムの使い方については、「カスタムコードリソース」のセクションを参照してください。

ページの先頭に戻る


QuickDraw グローバル

QuickDraw グローバル変数はもはや構造体参照を使ってアクセスされません。これらのグローバルにアクセスするときは、アクセッサルーチンを使用する必要があります。

                           
    long GetQDGlobalsRandomSeed(void);
                           
    BitMap * GetQDGlobalsScreenBits(BitMap *screenBits);
                           
    Cursor *GetQDGlobalsArrow(Cursor *arrow);
                           
    Pattern *GetQDGlobalsDarkGray(Pattern *dkGray);
                           
    Pattern *GetQDGlobalsLightGray(Pattern *ltGray);
                           
    Pattern *GetQDGlobalsGray(Pattern *gray);
                           
    Pattern *GetQDGlobalsBlack(Pattern *black);
                           
    Pattern *GetQDGlobalsWhite(Pattern *white);
                           
    CGrafPtr GetQDGlobalsThePort(void);
    
    void SetQDGlobalsRandomSeed(long randomSeed);
                           
    void SetQDGlobalsArrow(const Cursor *arrow);
                           

リスト 8 新しい QuickDraw グローバルアクセッサルーチン

ページの先頭に戻る


The Scrap Manager

Scrap Manager API は、拡張機能を提供するために拡張されました。新しい Scrap Manager の最も興味深い機能の 1 つは、アプリケーションが promised フレーバーを指定することができ、クライアントアプリケーションが promised スクラップフレーバーのデータを要求するまで、アプリケーションはそれを提供する必要がないということです。これにより、追加の処理要件を必要とすることなく、アプリケーションがより豊富なスクラップタイプの選択を提供できるようになることは明らかです。

ページの先頭に戻る




対応関係一覧

このセクションの早見表を利用すると、既存の Mac OS API と Mac OS X でそれらの API によって提供される機能の対応関係をすばやく確認することができます。「サポートされています」と記載されている項目は Carbon API として用意されていますが、それ以外の項目はサポートされていません。


Mac OS 7/8/9 のテクノロジ

Mac OS X での類似機能

Alias Manager

Alias Manager は Carbon でもサポートされています。詳細については、Alias Manager の Carbon 仕様を参照してください。

Appearance Manager

Carbon では引き続き Appearance Manager を使用します。そのため、新しい Aqua ユーザインタフェースを無償で手に入れることができます。詳細については、Appearance Manager の Carbon 仕様を参照してください。

Apple Event Manager

Classic、Cocoa、および Carbon 間で Apple イベントを相互に送信するために使用できます。ただし、リモートマシンにイベントを送信することを目的として使用できなくなりました。詳細については、Apple Event Manager の Carbon 仕様を参照してください。

Apple Filing Protocol (AFP)

PBControl または NAFPCommand 呼び出しを使って AppleShare Server に AFP パケットを送信している開発者が Mac OS X でもこれらのサービスにアクセスしたい場合は、製品を改訂して、AppleShareClientCore フレームワークによって提供される新しい AFP API を使用する必要があります。このフレームワークは、Carbon アプリケーションと Mach-O バイナリとしてコンパイルされている Cocoa アプリケーションの両方で使用できます。AppleShareClientCore/afpDataStream.h で定義されている AFP Datastream API は、以前の API と同じ機能を提供します。

Apple Game Sprockets

相当する機能は他のマネージャで見つけてください。詳細については、Apple Game Sprockets の Carbon 仕様を参照してください。

Apple Guide

Apple ガイド サポートされていません。Apple ガイドのヘルプ機能は Help Viewer ヘルプブックに移行する必要があります。

Apple Help Viewer

Apple Help Viewer は今後もサポートされます。ただし、Mac OS X 上のヘルプブック形式は改訂され、アプリケーションバンドル形式により近いものになりました (ローカライズ可能な情報を含めて)。詳細については、Printing Manager の Carbon 仕様を参照してください。

Apple Shared Library Manager

サポートされていません。

Apple Type Services for Unicode

サポートされています。詳細については、ATSUI の Carbon 仕様を参照してください。

AppleScript

完全にサポートされています。詳細については、Open Scripting Architecture の Carbon 仕様を参照してください。

AppleShare

AppleShareClientCore フレームワークによって提供される新しい AFP API を使用します。

Code Fragment Manager

サポートされています。詳細については、Code Fragment Manager の Carbon 仕様を参照してください。

Collection Manager

Collection Manager は Carbon でもサポートされています。詳細については、Collection Manager の Carbon 仕様を参照してください。

ColorSync Manager

完全にサポートされています。

Communications Toolbox

サポートされていません。

Component Manager

完全にサポートされています。詳細については、Component Manager の Carbon 仕様を参照してください。

Contextual Menu Manager

サポートされています。SOM CMM は今度サポートされません。

Control Manager

サポートされています。

Control Panels

サポートされていません。代わりにアプリケーションを使用します。

Control Strip

ドック内に配置します。

Cursor Utilities

カーソルユーティリティは Mac OS X でも完全にサポートされています。また、アプリケーションが時間のかかる操作の完了を待っているときに、開発者が独自のカスタムアニメーションタスクを表示する必要はもはやありません。Mac OS X は、最前面のタスクがブロックされるたびに、回転する虹色のアニメーションディスクカーソルを自動的に表示します。

Date, Time, and Measurement Utilities

完全にサポートされています。

Dialog Manager

サポートされています。ただし、一部のルーチンは削除されました。詳細については、Dialog Manager の Carbon 仕様を参照してください。

Disk Initialization Manager

サポートされていません。今後はデスクトップ (これまでの Finder) を使用します。

Display Manager

サポートされています。詳細については、Display Manager の Carbon 仕様を参照してください。

Drag Manager

サポートされています。詳細については、Drag Manager の Carbon 仕様を参照してください。

Edition Manager

Edition Manager サポートされていません。

Event Manager

サポートされています。

新しく導入されたイベントモデルは「Carbon イベント」と呼ばれます。一部のマニュアルは、CarbonLib SDK に含まれています。

Exception Manager

サポートされていません。

File Manager

File Manager は Carbon でもサポートされています。ただし、File Manager の API の一部は削除されました。特に、「作業ディレクトリ」という概念は Carbon ではサポートされていません。作業ディレクトリを使用する代わりに、アプリケーションは常にファイルシステムのエンティティを参照して、明示的な名前、ボリューム、およびディレクトリ ID を使用する必要があります。

ファイルシステムにアクセスするには、新しい HFS Plus API を使用し始めることをお勧めします。新しい HFS Plus API の詳細については、File Manager のマニュアルを参照してください。

File System Manager

File System Manager は、Carbon または Mac OS X ではもはやサポートされません。Mac OS X でこの機能が必要な場合は、VFS (Virtual File System) プラグイン Mach-O 拡張機能を実装する必要があります。

Find By Content / Sherlock

サポートされています。

Finder Interface

Mac OS X では、ファイルシステムとともにユーザインタフェースを提供するアプリケーションは「デスクトップ」と呼ばれます。このアプリケーションは、以前のシステムリリースとともに出荷されていた Finder アプリケーションの機能を代替します。

伝統的な Finder リソースと Finder 情報は、デスクトップアプリケーションによって認識されます。さらに、デスクトップは Mac OS 9 のパッケージも認識します。

Mac OS X には、『Mac OS X System Overview』でマニュアル化されている、より豊かなアプリケーションバンドル方式が組み込まれています。

Folder Manager

システムによって維持される特殊フォルダの位置は、アプリケーションが Mac OS X 内で実行されるときに劇的に変わる可能性があります。したがって、アプリケーションがこれらの特殊フォルダの位置を識別するときは、FindFolder によって返されるボリューム参照番号とディレクトリ ID の両方を拠り所にすることが重要です。

また、これらのフォルダ内に格納されているファイルに対するアクセス権はユーザごとに異なる可能性があるという事実をアプリケーションが正しく認識していることも必要です。詳細については、このテクニカルノートの「特殊フォルダとファイルアクセス権」のセクションを参照してください。

Font Manager

サポートされています。

FontSync

サポートされています。

Gestalt Manager

サポートされています。

Help Manager

Balloon Manager はヘルプタグに置き換えられました。Carbon アプリケーションは、MacHelp.h で定義されている、この新しい Apple ヘルプ API を使用します。詳細については、Apple ヘルプの Carbon 仕様を参照してください。

HTML Rendering Library

Carbon でも完全にサポートされています。詳細については、HTML 描画ライブラリの Carbon 仕様を参照してください。

Icon Services and Utilities

サポートされています。

Imaging (ATSUI)

サポートされています。

Installer

サポートされていません。Mac OS X には、新しいインストーラメカニズムが用意されています。

Interfaces & Libraries

3.3.2.

List Manager

サポートされています。新しいデータブラウザコントロールを使用して、一貫した「ルック」により、リストをこれまでよりも容易に表示することができます。

Locales

サポートされています。

Location Manager

サポートされていません。

Low Memory Accessors

アクセッサ関数がローメモリグローバルにアクセスするための唯一の方法になりました。他の方法でローメモリグローバルにアクセスしようとすると、アドレスエラーが発生する可能性があります。

これらの多くは削除されました。詳細については、ローメモリアクセッサの Carbon 仕様を参照してください。

Mac OS USB

サポートされています。

MacApp

ポートされます。

Macintosh Programmer's Workshop (MPW)

Classic 環境で使用できます。

MacsBug

Classic 環境で使用できます。

Mathematical and Logical Utilities

MathLib の機能は CarbonLib からエクスポートされます。

Memory Manager

サポートされています。ただし、メモリの処理方法に一部変更が加えられました。特に注目すべきは、アプリケーションのヒープスペースが動的に拡大し、もはや固定ではなくなったことです (Carbon および Cocoa アプリケーションのみ)。詳細については、Memory Manager の Carbon 仕様を参照してください。

Menu Manager

サポートされています。

Mixed Mode Manager

サポートされていません。

MRJ

サポートされています。Java 1.2 以降でなければなりません。

Multilingual Text Editor

サポートされています。

Multiprocessing Services

サポートされています。

Multiple Users

マルチユーザに関連する API はサポートされていません。ただし、ユーザレベルとログインレベルの概念はサポートされています。

Navigation Services

サポートされています。

Network Services Location (NSL) Manager

サポートされています。

Notification Manager

サポートされています。詳細については、Notification Manager の Carbon 仕様を参照してください。

Offscreen Graphics Worlds

サポートされています。詳細については、QuickDraw Manager の Carbon 仕様を参照してください。

Open Transport

サポートされています。ただし、一部の API は削除されました。詳細については、Open Transport の Carbon 仕様を参照してください。

Open GL

サポートされています。

Package Manager

サポートされていません。

Palette Manager

サポートされています。詳細については、Palette Manager の Carbon 仕様を参照してください。

PCI Driver Development Kit

IOKit を参照してください。

Picture Utilities

サポートされています。

PPC Toolbox

PPC Toolbox は Carbon には実装されていません。プロセス間で情報を送信するには Apple Event Manager を使用してください。

Printing Manager

Printing Manager の新しい API が用意されています。現在のマニュアルは Carbon SDK に含まれています。詳細については、Printing Manager の Carbon 仕様を参照してください。

Process Manager

サポートされています。

Queue Utilities

サポートされています。

QuickDraw

サポートされています。CFM アプリケーションから Quartz を使用することはできませんが、アプリケーションを Mach-O バイナリとしてコンパイルしている場合は使用できます。

QuickDraw 3D

サポートされていません。

QuickDraw Text

サポートされています。

QuickTime

QuickTime API は CarbonLib に用意されています。

ResEdit

Classic で動作します。特定の操作を行うと、クラッシュする場合があります。

Resource Manager

サポートされています。詳細については、Resource Manager の Carbon 仕様を参照してください。

Scrap Manager

サポートされていますが、新しい API が含まれています。Carbon SDK でマニュアル化されています。

Script Manager

サポートされています。

Shutdown Manager

サポートされていません。この機能を必要とするアプリケーションは、kAEQuitApplication イベントを使用する必要があります。

Sound Manager

サポートされています。

Speech Recognition Manager

サポートされています。

Speech Synthesis Manager

サポートされています。

Start Manager

サポートされていません。機能拡張は存在しないため、機能拡張のロード順序は重要ではありません。

Telephone Manager

サポートされていません。

Text Encoding Conversion Manager

サポートされています。

Text Services Manager

サポートされています。

Text Utilities

サポートされています。

TextEdit

サポートされています。

Thread Manager

サポートされています。

Time Manager

サポートされています。

Translation Manager

サポートされています。

Trap Manager

サポートされていません。

Unicode Utilities

サポートされています。

URL Access Manager

サポートされています。

Vertical Retrace Manager

サポートされていません。代わりに Time Manager を使用します。

Virtual Memory Manager

サポートされていません。

Window Manager

サポートされています。

ページの先頭に戻る